package com.zz.springboot.resp;

import com.zz.springboot.resp.enums.BasicEnum;
import com.zz.springboot.resp.enums.RespCodeEnum;
import com.zz.springboot.exception.BasicException;
import com.zz.springboot.resp.base.BasicResp;
import lombok.Data;

/**
 * 统一响应模板（不分页）
 * <p>
 * 当返回给前端的响应数据，不仅包含响应码、响应提示信息等相关信息，还包含组装数据，且不分页时，可以选择此类
 */
@Data
public class RespTemplate<T> extends BasicResp {

    T data;  //数据

    public RespTemplate(){}

    public RespTemplate(String msg){
        this.resultMsg = msg;
    }

    public RespTemplate(String code, String msg) {
        this.resultCode = code;
        this.resultMsg = msg;
    }


    public RespTemplate(T data, String code, String msg) {
        this.data = data;
        this.resultCode = code;
        this.resultMsg = msg;
    }


    /** ------------------------- 下面为结合【响应枚举】设计的统一方法 ------------------------- **/


    /**
     * 响应成功模板-处理有data返回
     * @param data
     * @param <T>
     * @return
     */
    public static <T> RespTemplate<T> success(T data) {
        return new RespTemplate(data, RespCodeEnum.SUCCESS.getErrCode(), RespCodeEnum.SUCCESS.getErrMsg());
    }


    /**
     * 响应成功模板-处理无data返回（此时data默认为null）
     * @return
     */
    public static RespTemplate success() {
        return new RespTemplate(RespCodeEnum.SUCCESS.getErrCode(), RespCodeEnum.SUCCESS.getErrMsg());
    }


    /**
     * 响应异常模板-处理业务异常
     * @param e
     * @return
     */
    public static RespTemplate error(BasicException e) {
        return new RespTemplate(e.getErrCode(), e.getErrMsg());
    }


    /**
     * 响应异常模板-处理系统异常
     * @return
     */
    public static RespTemplate error() {
        return new RespTemplate(RespCodeEnum.SYSTEM_FAIL.getErrCode(), RespCodeEnum.SYSTEM_FAIL.getErrMsg());
    }


    /**
     * 响应异常模板-处理其它异常（在枚举类中维护）
     * @param basicEnum
     * @return
     */
    public static RespTemplate error(BasicEnum basicEnum) {
        return new RespTemplate(basicEnum.getErrCode(), basicEnum.getErrMsg());
    }


    /**
     * 响应异常模板-处理其它异常（未在枚举类中维护）
     * @param errCode
     * @param errMsg
     * @return
     */
    public static RespTemplate error(String errCode,String errMsg) {
        return new RespTemplate(errCode, errMsg);
    }

    /**
     * 响应异常模板- 处理其它未自定义异常，如UnknownAccountException等
     * @param e
     * @return
     */
    public static RespTemplate error(RuntimeException e) {
        return new RespTemplate();
    }
}